1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | 'use strict';
|
7 |
|
8 | var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default'];
|
9 |
|
10 | var _getIterator = require('babel-runtime/core-js/get-iterator')['default'];
|
11 |
|
12 | var _Set = require('babel-runtime/core-js/set')['default'];
|
13 |
|
14 | var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
|
15 |
|
16 | exports.__esModule = true;
|
17 |
|
18 | var _fs = require('fs');
|
19 |
|
20 | var _fs2 = _interopRequireDefault(_fs);
|
21 |
|
22 | var _path2 = require('path');
|
23 |
|
24 | var _path3 = _interopRequireDefault(_path2);
|
25 |
|
26 | var _module2 = require('module');
|
27 |
|
28 | var _module3 = _interopRequireDefault(_module2);
|
29 |
|
30 | var _toolsLog = require('./tools/log');
|
31 |
|
32 | var _toolsLog2 = _interopRequireDefault(_toolsLog);
|
33 |
|
34 | var _helpers = require('./helpers');
|
35 |
|
36 | var _toolsSerializeJavascript = require('./tools/serialize-javascript');
|
37 |
|
38 | var _toolsSerializeJavascript2 = _interopRequireDefault(_toolsSerializeJavascript);
|
39 |
|
40 | var original_findPath = _module3['default']._findPath;
|
41 |
|
42 | var Require_hacker = (function () {
|
43 | function Require_hacker(options) {
|
44 | var _this = this;
|
45 |
|
46 | _classCallCheck(this, Require_hacker);
|
47 |
|
48 | this.preceding_abstract_path_resolvers = [];
|
49 | this.abstract_path_resolvers = [];
|
50 | this.abstract_path_resolved_modules = {};
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 | this.log = new _toolsLog2['default']('require-hook', { debug: options.debug });
|
57 |
|
58 |
|
59 |
|
60 | _module3['default']._findPath = function () {
|
61 | for (var _len = arguments.length, parameters = Array(_len), _key = 0; _key < _len; _key++) {
|
62 | parameters[_key] = arguments[_key];
|
63 | }
|
64 |
|
65 | var request = parameters[0];
|
66 |
|
67 |
|
68 |
|
69 | for (var _iterator = _this.preceding_abstract_path_resolvers, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
|
70 | var _ref;
|
71 |
|
72 | if (_isArray) {
|
73 | if (_i >= _iterator.length) break;
|
74 | _ref = _iterator[_i++];
|
75 | } else {
|
76 | _i = _iterator.next();
|
77 | if (_i.done) break;
|
78 | _ref = _i.value;
|
79 | }
|
80 |
|
81 | var resolver = _ref;
|
82 |
|
83 | var resolved = resolver.resolve(request);
|
84 | if (typeof resolved !== 'undefined') {
|
85 | return resolved;
|
86 | }
|
87 | }
|
88 |
|
89 |
|
90 | var filename = original_findPath.apply(undefined, parameters);
|
91 | if (filename !== false) {
|
92 | return filename;
|
93 | }
|
94 |
|
95 |
|
96 | for (var _iterator2 = _this.abstract_path_resolvers, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
|
97 | var _ref2;
|
98 |
|
99 | if (_isArray2) {
|
100 | if (_i2 >= _iterator2.length) break;
|
101 | _ref2 = _iterator2[_i2++];
|
102 | } else {
|
103 | _i2 = _iterator2.next();
|
104 | if (_i2.done) break;
|
105 | _ref2 = _i2.value;
|
106 | }
|
107 |
|
108 | var resolver = _ref2;
|
109 |
|
110 | var resolved = resolver.resolve(request);
|
111 | if (typeof resolved !== 'undefined') {
|
112 | return resolved;
|
113 | }
|
114 | }
|
115 |
|
116 | return false;
|
117 | };
|
118 | }
|
119 |
|
120 |
|
121 |
|
122 |
|
123 |
|
124 |
|
125 |
|
126 |
|
127 |
|
128 |
|
129 |
|
130 |
|
131 |
|
132 |
|
133 |
|
134 |
|
135 |
|
136 |
|
137 |
|
138 |
|
139 |
|
140 |
|
141 |
|
142 |
|
143 | Require_hacker.prototype.global_hook = function global_hook(id, resolver) {
|
144 | var _this2 = this;
|
145 |
|
146 | var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
|
147 |
|
148 | validate.global_hook(id, resolver);
|
149 |
|
150 | var resolver_entry = {
|
151 | id: id,
|
152 | resolve: function resolve(path) {
|
153 | var resolved_path = path + '.' + id;
|
154 |
|
155 |
|
156 | var source = resolver(path);
|
157 |
|
158 | if (!_helpers.exists(source)) {
|
159 | return;
|
160 | }
|
161 |
|
162 |
|
163 | delete require.cache[resolved_path];
|
164 |
|
165 | _this2.abstract_path_resolved_modules[resolved_path] = source;
|
166 |
|
167 | return resolved_path;
|
168 | }
|
169 | };
|
170 |
|
171 | if (options.precede_node_loader) {
|
172 | this.preceding_abstract_path_resolvers.push(resolver_entry);
|
173 | } else {
|
174 | this.abstract_path_resolvers.push(resolver_entry);
|
175 | }
|
176 |
|
177 | var hook = this.hook(id, function (path) {
|
178 | var source = _this2.abstract_path_resolved_modules[path];
|
179 | delete _this2.abstract_path_resolved_modules[path];
|
180 | return source;
|
181 | });
|
182 |
|
183 | var result = {
|
184 | unmount: function unmount() {
|
185 |
|
186 | _this2.preceding_abstract_path_resolvers = _this2.preceding_abstract_path_resolvers.filter(function (x) {
|
187 | return x !== resolver_entry;
|
188 | });
|
189 | _this2.abstract_path_resolvers = _this2.abstract_path_resolvers.filter(function (x) {
|
190 | return x !== resolver_entry;
|
191 | });
|
192 | hook.unmount();
|
193 | }
|
194 | };
|
195 |
|
196 | return result;
|
197 | };
|
198 |
|
199 |
|
200 |
|
201 |
|
202 |
|
203 |
|
204 |
|
205 |
|
206 |
|
207 |
|
208 |
|
209 |
|
210 |
|
211 |
|
212 |
|
213 |
|
214 |
|
215 | Require_hacker.prototype.hook = function hook(extension, resolve) {
|
216 | var _this3 = this;
|
217 |
|
218 | this.log.debug('Hooking into *.' + extension + ' files loading');
|
219 |
|
220 |
|
221 | validate.extension(extension);
|
222 | validate.resolve(resolve);
|
223 |
|
224 |
|
225 | var dot_extension = '.' + extension;
|
226 |
|
227 |
|
228 | var original_loader = _module3['default']._extensions[dot_extension];
|
229 |
|
230 |
|
231 | if (original_loader) {
|
232 |
|
233 |
|
234 | this.log.debug('-----------------------------------------------');
|
235 | this.log.debug('Overriding an already existing require() hook ');
|
236 | this.log.debug('for file extension ' + dot_extension);
|
237 | this.log.debug('-----------------------------------------------');
|
238 | }
|
239 |
|
240 |
|
241 | var cached_modules = new _Set();
|
242 |
|
243 |
|
244 | _module3['default']._extensions[dot_extension] = function (module, filename) {
|
245 | _this3.log.debug('Loading source code for ' + filename);
|
246 |
|
247 |
|
248 | var aborted = false;
|
249 |
|
250 |
|
251 | var source = resolve(filename, function () {
|
252 | _this3.log.debug('Fallback to original loader');
|
253 |
|
254 |
|
255 | aborted = true;
|
256 |
|
257 |
|
258 |
|
259 | if (_path3['default'].extname(filename) !== dot_extension) {
|
260 | _this3.log.info('Trying to load "' + _path3['default'].basename(filename) + '" as a "*' + dot_extension + '"');
|
261 | }
|
262 |
|
263 |
|
264 | (original_loader || _module3['default']._extensions['.js'])(module, filename);
|
265 | });
|
266 |
|
267 |
|
268 | if (aborted) {
|
269 | return;
|
270 | }
|
271 |
|
272 |
|
273 | cached_modules.add(filename);
|
274 |
|
275 |
|
276 |
|
277 | module._compile(source, filename);
|
278 | };
|
279 |
|
280 | var result = {
|
281 |
|
282 | unmount: function unmount() {
|
283 |
|
284 | for (var _iterator3 = cached_modules, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
|
285 | var _ref3;
|
286 |
|
287 | if (_isArray3) {
|
288 | if (_i3 >= _iterator3.length) break;
|
289 | _ref3 = _iterator3[_i3++];
|
290 | } else {
|
291 | _i3 = _iterator3.next();
|
292 | if (_i3.done) break;
|
293 | _ref3 = _i3.value;
|
294 | }
|
295 |
|
296 | var _path = _ref3;
|
297 |
|
298 | delete require.cache[_path];
|
299 | }
|
300 |
|
301 |
|
302 | _module3['default']._extensions[dot_extension] = original_loader;
|
303 | }
|
304 | };
|
305 |
|
306 | return result;
|
307 | };
|
308 |
|
309 |
|
310 |
|
311 |
|
312 |
|
313 |
|
314 |
|
315 |
|
316 |
|
317 |
|
318 |
|
319 |
|
320 |
|
321 |
|
322 |
|
323 |
|
324 |
|
325 |
|
326 |
|
327 |
|
328 |
|
329 |
|
330 |
|
331 |
|
332 |
|
333 |
|
334 | return Require_hacker;
|
335 | })();
|
336 |
|
337 | exports['default'] = Require_hacker;
|
338 | var validate = {
|
339 | extension: function extension(_extension) {
|
340 |
|
341 |
|
342 |
|
343 |
|
344 |
|
345 | if (_path3['default'].extname('test.' + _extension) !== '.' + _extension) {
|
346 | throw new Error('Invalid file extension ' + _extension);
|
347 | }
|
348 | },
|
349 |
|
350 | resolve: function resolve(_resolve) {
|
351 | if (typeof _resolve !== 'function') {
|
352 | throw new Error('Resolve should be a function. Got ' + _resolve);
|
353 | }
|
354 | },
|
355 |
|
356 | global_hook: function global_hook(id, resolver) {
|
357 | if (!id) {
|
358 | throw new Error('You must specify global hook id');
|
359 | }
|
360 |
|
361 | if (_path3['default'].extname('test.' + id) !== '.' + id) {
|
362 | throw new Error('Invalid global hook id. Expected a valid file extension.');
|
363 | }
|
364 |
|
365 | validate.resolve(resolver);
|
366 | }
|
367 | };
|
368 |
|
369 |
|
370 | Require_hacker.to_javascript_module_source = function (anything) {
|
371 |
|
372 | if (!_helpers.exists(anything)) {
|
373 | return 'module.exports = undefined';
|
374 | }
|
375 |
|
376 |
|
377 | if (typeof anything === 'string' && is_a_module_declaration(anything)) {
|
378 | return anything;
|
379 | }
|
380 |
|
381 |
|
382 | return 'module.exports = ' + _toolsSerializeJavascript2['default'](anything);
|
383 | };
|
384 |
|
385 |
|
386 | function is_a_module_declaration(text) {
|
387 | return text.indexOf('module.exports = ') === 0 || /\s+module\.exports = .+/.test(text);
|
388 | }
|
389 | module.exports = exports['default'];
|
390 |
|
391 |
|
392 |
|
\ | No newline at end of file |